Skip to content

zix http1 entry - #998

Open
prothegee wants to merge 65 commits into
MDA2AV:mainfrom
prothegee:zix-http1
Open

zix http1 entry#998
prothegee wants to merge 65 commits into
MDA2AV:mainfrom
prothegee:zix-http1

Conversation

@prothegee

@prothegee prothegee commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

Description

zix entry for http1 using 0.5.x branch.

Update:

  • Using dual listener port.
  • Tweak on config init side.
  • Adding new tests:
    • static-tls
    • json-tls
    • api-4
    • api-16
    • async-db
    • crud

Checklist:

  • /benchmark -f zix
  • /benchmark -f zix --save

@prothegee

Copy link
Copy Markdown
Contributor Author

Testing new approach and database tests entries for H1.

@prothegee

Copy link
Copy Markdown
Contributor Author

/benchmark -f zix

@github-actions

Copy link
Copy Markdown
Contributor

👋 /benchmark request received. A collaborator will review and approve the run.

@github-actions

Copy link
Copy Markdown
Contributor

Benchmark Results

Framework: zix | Test: all tests

Test Conn RPS CPU Mem Δ RPS Δ Mem
baseline 512 4,271,672 6433.6% 541MiB +1.3% +316.2%
baseline 4096 4,421,593 6274.1% 565MiB -1.6% +203.8%
pipelined 512 53,759,494 6441.7% 540MiB +0.3% +303.0%
pipelined 4096 55,456,780 6287.7% 563MiB -0.9% +202.7%
limited-conn 512 2,692,208 5435.0% 545MiB -1.8% +263.3%
limited-conn 4096 2,713,743 5613.0% 576MiB -1.4% +143.0%
json 4096 2,367,341 5563.2% 563MiB +0.8% +94.1%
json-comp 512 2,229,405 5245.1% 551MiB NEW NEW
json-comp 4096 3,081,536 6299.5% 572MiB NEW NEW
json-comp 16384 2,897,019 6390.4% 627MiB NEW NEW
json-tls 4096 1,924,633 4725.9% 691MiB NEW NEW
upload 32 8,202 1042.1% 533MiB +0.2% +329.8%
upload 256 6,667 930.5% 535MiB ~0% +311.5%
api-4 256 67,827 260.7% 96MiB NEW NEW
api-16 1024 249,618 1418.6% 330MiB NEW NEW
static 1024 2,035,434 5566.0% 546MiB +0.5% +290.0%
static 4096 2,020,569 5441.5% 589MiB -0.8% +202.1%
static 6800 1,995,731 5432.8% 625MiB +0.5% +159.3%
async-db 1024 161,571 5287.1% 778MiB NEW NEW
crud 4096 397,237 6125.3% 911MiB NEW NEW
Full log

  1615711 requests in 10.00s, 1615714 responses
  Throughput: 161.53K req/s
  Bandwidth:  622.15MB/s
  Status codes: 2xx=1615714, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 1615713 / 1615714 responses (100.0%)
  Reconnects: 64447
  Per-template: 322384,323182,324038,323664,322445
  Per-template-ok: 322384,323182,324038,323664,322445
[info] CPU 5287.1% | Mem 778MiB

[run 2/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     1024 (16/thread)
  Pipeline:  1
  Req/conn:  25
  Templates: 5
  Expected:  200
  Duration:  10s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   5.87ms   4.02ms   13.30ms   26.40ms   40.20ms

  1597296 requests in 10.00s, 1597296 responses
  Throughput: 159.69K req/s
  Bandwidth:  615.35MB/s
  Status codes: 2xx=1597296, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 1597288 / 1597296 responses (100.0%)
  Reconnects: 63687
  Per-template: 318534,319412,320003,320251,319088
  Per-template-ok: 318534,319412,320003,320251,319088
[info] CPU 5310.1% | Mem 778MiB

[run 3/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     1024 (16/thread)
  Pipeline:  1
  Req/conn:  25
  Templates: 5
  Expected:  200
  Duration:  10s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   5.98ms   4.05ms   13.60ms   27.70ms   42.50ms

  1576268 requests in 10.00s, 1576269 responses
  Throughput: 157.59K req/s
  Bandwidth:  607.15MB/s
  Status codes: 2xx=1576269, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 1576268 / 1576269 responses (100.0%)
  Reconnects: 62916
  Per-template: 314270,315364,315921,316093,314620
  Per-template-ok: 314270,315364,315921,316093,314620
[info] CPU 5283.3% | Mem 780MiB

=== Best: 161571 req/s (CPU: 5287.1%, Mem: 778MiB) ===
[info] input BW: 10.79MB/s (avg template: 70 bytes)
[info] saved results/async-db/1024/zix.json
httparena-bench-zix
httparena-bench-zix

==============================================
=== zix / crud / 4096c (tool=gcannon) ===
==============================================
[info] resetting postgres for a clean per-profile baseline
[info] starting postgres sidecar
httparena-postgres
[info] postgres ready (seeded)
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  200
  Templates: 20
  Expected:  200
  Duration:  15s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   9.55ms   4.58ms   26.30ms   53.60ms   82.50ms

  5914586 requests in 15.00s, 5914458 responses
  Throughput: 394.23K req/s
  Bandwidth:  117.30MB/s
  Status codes: 2xx=5914458, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 5914458 / 5914458 responses (100.0%)
  Reconnects: 27558
  Per-template: 276171,225981,237739,245494,247002,252165,260374,272274,298253,322818,332488,336119,334368,335294,337649,335812,346286,332210,292270,293691
  Per-template-ok: 276171,225981,237739,245494,247002,252165,260374,272274,298253,322818,332488,336119,334368,335294,337649,335812,346286,332210,292270,293691
[info] CPU 6079.2% | Mem 836MiB

[run 2/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  200
  Templates: 20
  Expected:  200
  Duration:  15s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   10.29ms   5.50ms   27.60ms   55.70ms   81.50ms

  5523342 requests in 15.00s, 5523342 responses
  Throughput: 368.15K req/s
  Bandwidth:  108.67MB/s
  Status codes: 2xx=5523342, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 5523342 / 5523342 responses (100.0%)
  Reconnects: 25697
  Per-template: 283340,225371,200793,213489,215258,220841,233345,263351,292941,305974,307911,305734,307094,310358,310255,310865,320324,317244,290729,288125
  Per-template-ok: 283340,225371,200793,213489,215258,220841,233345,263351,292941,305974,307911,305734,307094,310358,310255,310865,320324,317244,290729,288125
[info] CPU 6153.5% | Mem 867MiB

[run 3/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  200
  Templates: 20
  Expected:  200
  Duration:  15s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   9.47ms   3.37ms   27.40ms   55.40ms   80.70ms

  5958566 requests in 15.00s, 5958566 responses
  Throughput: 397.13K req/s
  Bandwidth:  117.90MB/s
  Status codes: 2xx=5958566, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 5958549 / 5958566 responses (100.0%)
  Reconnects: 27904
  Per-template: 283593,242813,239440,229595,232262,234667,243260,267479,299094,327889,338869,341645,340298,341922,343987,342990,350179,320409,322060,316098
  Per-template-ok: 283593,242813,239440,229595,232262,234667,243260,267479,299094,327889,338869,341645,340298,341922,343987,342990,350179,320409,322060,316098
[info] CPU 6125.3% | Mem 911MiB

=== Best: 397237 req/s (CPU: 6125.3%, Mem: 911MiB) ===
[info] input BW: 34.10MB/s (avg template: 90 bytes)
[info] saved results/crud/4096/zix.json
httparena-bench-zix
httparena-bench-zix
[info] skip: zix does not subscribe to fortunes
[info] skip: zix does not subscribe to baseline-h2
[info] skip: zix does not subscribe to static-h2
[info] skip: zix does not subscribe to baseline-h2c
[info] skip: zix does not subscribe to json-h2c
[info] skip: zix does not subscribe to baseline-h3
[info] skip: zix does not subscribe to static-h3
[info] skip: zix does not subscribe to gateway-64
[info] skip: zix does not subscribe to gateway-h3
[info] skip: zix does not subscribe to production-stack
[info] skip: zix does not subscribe to unary-grpc
[info] skip: zix does not subscribe to unary-grpc-tls
[info] skip: zix does not subscribe to stream-grpc
[info] skip: zix does not subscribe to stream-grpc-tls
[info] skip: zix does not subscribe to echo-ws
[info] skip: zix does not subscribe to echo-ws-pipeline
[info] rebuilding site/data/*.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/frameworks.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/api-16-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/api-4-256.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/async-db-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/crud-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-comp-16384.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-comp-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-comp-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-tls-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/limited-conn-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/limited-conn-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/pipelined-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/pipelined-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-6800.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/upload-256.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/upload-32.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/current.json
[info] done
httparena-postgres
httparena-redis
[info] restoring loopback MTU to 65536

@prothegee

Copy link
Copy Markdown
Contributor Author

Oh my, didn't expect the cpu burn that much with high memory consumption.

@prothegee
prothegee marked this pull request as draft July 15, 2026 20:09
@prothegee
prothegee marked this pull request as ready for review July 21, 2026 02:43
@github-actions

Copy link
Copy Markdown
Contributor

Benchmark Results

Framework: zix | Test: all tests

Test Conn RPS CPU Mem Δ RPS Δ Mem
baseline 512 4,067,485 6443.9% 127MiB -3.6% -2.3%
baseline 4096 4,455,412 6415.3% 188MiB -0.8% +1.1%
pipelined 512 53,352,112 6435.5% 124MiB -0.5% -7.5%
pipelined 4096 57,643,456 6223.0% 188MiB +3.0% +1.1%
limited-conn 512 2,640,088 5615.1% 122MiB -3.7% -18.7%
limited-conn 4096 2,703,646 5845.0% 231MiB -1.7% -2.5%
json 4096 2,420,229 6110.8% 244MiB +3.0% -15.9%
json-comp 512 1,028,610 6112.8% 123MiB NEW NEW
json-comp 4096 1,139,164 6839.4% 206MiB NEW NEW
json-comp 16384 1,110,719 6827.6% 522MiB NEW NEW
json-tls 4096 1,938,324 4996.3% 273MiB NEW NEW
upload 32 8,872 1039.4% 124MiB +8.4% ~0%
upload 256 6,460 891.1% 126MiB -3.0% -3.1%
api-4 256 69,172 227.1% 41MiB NEW NEW
api-16 1024 249,200 969.6% 120MiB NEW NEW
static 1024 2,026,656 5612.5% 141MiB ~0% +0.7%
static 4096 2,026,878 5598.9% 205MiB -0.5% +5.1%
static 6800 1,988,793 5367.8% 273MiB +0.1% +13.3%
async-db 1024 407,196 3235.6% 325MiB NEW NEW
crud 4096 837,446 3310.6% 395MiB NEW NEW
Full log

  4071965 requests in 10.00s, 4071966 responses
  Throughput: 407.11K req/s
  Bandwidth:  1.53GB/s
  Status codes: 2xx=4071966, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 4071962 / 4071966 responses (100.0%)
  Reconnects: 162419
  Per-template: 811429,814276,816822,816811,812624
  Per-template-ok: 811429,814276,816822,816811,812624
[info] CPU 3235.6% | Mem 325MiB

[run 2/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     1024 (16/thread)
  Pipeline:  1
  Req/conn:  25
  Templates: 5
  Expected:  200
  Duration:  10s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   2.08ms    692us   4.67ms   21.50ms   50.00ms

  3772931 requests in 10.00s, 3772930 responses
  Throughput: 377.20K req/s
  Bandwidth:  1.42GB/s
  Status codes: 2xx=3772930, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 3772921 / 3772930 responses (100.0%)
  Reconnects: 150914
  Per-template: 751953,754270,756841,756803,753054
  Per-template-ok: 751953,754270,756841,756803,753054
[info] CPU 3147.3% | Mem 321MiB

[run 3/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     1024 (16/thread)
  Pipeline:  1
  Req/conn:  25
  Templates: 5
  Expected:  200
  Duration:  10s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   2.16ms    689us   5.05ms   21.90ms   45.30ms

  3729008 requests in 10.00s, 3729014 responses
  Throughput: 372.82K req/s
  Bandwidth:  1.40GB/s
  Status codes: 2xx=3729014, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 3729004 / 3729014 responses (100.0%)
  Reconnects: 149128
  Per-template: 743766,745439,747345,747674,744780
  Per-template-ok: 743766,745439,747345,747674,744780
[info] CPU 3126.2% | Mem 319MiB

=== Best: 407196 req/s (CPU: 3235.6%, Mem: 325MiB) ===
[info] input BW: 27.18MB/s (avg template: 70 bytes)
[info] saved results/async-db/1024/zix.json
httparena-bench-zix
httparena-bench-zix

==============================================
=== zix / crud / 4096c (tool=gcannon) ===
==============================================
[info] resetting postgres for a clean per-profile baseline
[info] starting postgres sidecar
httparena-postgres
[info] postgres ready (seeded)
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  200
  Templates: 20
  Expected:  200
  Duration:  15s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   5.23ms   1.61ms   14.80ms   23.50ms   34.80ms

  11082572 requests in 15.00s, 11081230 responses
  Throughput: 738.63K req/s
  Bandwidth:  217.72MB/s
  Status codes: 2xx=11081230, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 11081230 / 11081230 responses (100.0%)
  Reconnects: 53375
  Per-template: 548375,527879,539612,543705,543367,538400,524202,509886,504585,507146,516086,529681,546070,565458,585245,606284,621683,624704,611758,587104
  Per-template-ok: 548375,527879,539612,543705,543367,538400,524202,509886,504585,507146,516086,529681,546070,565458,585245,606284,621683,624704,611758,587104
[info] CPU 2999.1% | Mem 402MiB

[run 2/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  200
  Templates: 20
  Expected:  200
  Duration:  15s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   4.79ms   1.85ms   13.60ms   23.10ms   31.40ms

  12041558 requests in 15.00s, 12041789 responses
  Throughput: 802.66K req/s
  Bandwidth:  235.94MB/s
  Status codes: 2xx=12041789, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 12041536 / 12041789 responses (100.0%)
  Reconnects: 58242
  Per-template: 574978,554696,570097,582662,590869,591236,588940,584179,579467,578767,580606,584441,597564,614677,634714,655356,665186,658931,638510,615660
  Per-template-ok: 574978,554696,570097,582662,590869,591236,588940,584179,579467,578767,580606,584441,597564,614677,634714,655356,665186,658931,638510,615660
[info] CPU 3165.9% | Mem 397MiB

[run 3/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  200
  Templates: 20
  Expected:  200
  Duration:  15s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   4.56ms   1.43ms   13.20ms   22.50ms   29.40ms

  12561703 requests in 15.00s, 12561702 responses
  Throughput: 837.31K req/s
  Bandwidth:  244.20MB/s
  Status codes: 2xx=12561702, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 12561663 / 12561702 responses (100.0%)
  Reconnects: 60974
  Per-template: 596624,579712,597201,611824,622188,627091,628935,626288,621374,620256,619929,618770,622523,633313,646516,664900,670682,664773,655041,633723
  Per-template-ok: 596624,579712,597201,611824,622188,627091,628935,626288,621374,620256,619929,618770,622523,633313,646516,664900,670682,664773,655041,633723
[info] CPU 3310.6% | Mem 395MiB

=== Best: 837446 req/s (CPU: 3310.6%, Mem: 395MiB) ===
[info] input BW: 71.88MB/s (avg template: 90 bytes)
[info] saved results/crud/4096/zix.json
httparena-bench-zix
httparena-bench-zix
[info] skip: zix does not subscribe to fortunes
[info] skip: zix does not subscribe to baseline-h2
[info] skip: zix does not subscribe to static-h2
[info] skip: zix does not subscribe to baseline-h2c
[info] skip: zix does not subscribe to json-h2c
[info] skip: zix does not subscribe to baseline-h3
[info] skip: zix does not subscribe to static-h3
[info] skip: zix does not subscribe to gateway-64
[info] skip: zix does not subscribe to gateway-h3
[info] skip: zix does not subscribe to production-stack
[info] skip: zix does not subscribe to unary-grpc
[info] skip: zix does not subscribe to unary-grpc-tls
[info] skip: zix does not subscribe to stream-grpc
[info] skip: zix does not subscribe to stream-grpc-tls
[info] skip: zix does not subscribe to echo-ws
[info] skip: zix does not subscribe to echo-ws-pipeline
[info] rebuilding site/data/*.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/frameworks.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/api-16-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/api-4-256.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/async-db-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/baseline-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/crud-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-comp-16384.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-comp-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-comp-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/json-tls-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/limited-conn-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/limited-conn-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/pipelined-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/pipelined-512.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-1024.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-4096.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/static-6800.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/upload-256.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/upload-32.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/current.json
[info] done
httparena-postgres
httparena-redis
[info] restoring loopback MTU to 65536

MDA2AV and others added 2 commits July 24, 2026 23:32
This branch saved results before MDA2AV#1034, so it carries 20
site/data/<profile>-<conns>.json files that main has since replaced with one
file per framework; git reported them all as modify/delete conflicts.

Every row this PR added or changed against its merge base was re-applied to
site/data/results/zix.json and the flat files dropped - 8 profiles this entry
did not publish before (api-4, api-16, async-db, crud, json-comp at three
connection counts, json-tls) and 12 it updated (baseline, limited-conn,
pipelined, json, static, upload). Two keys already in main were left alone,
because this PR did not touch them.
@prothegee

Copy link
Copy Markdown
Contributor Author

/benchmark -f zix --save

@github-actions

Copy link
Copy Markdown
Contributor

👋 /benchmark request received. A collaborator will review and approve the run.

@github-actions

Copy link
Copy Markdown
Contributor

Benchmark Results

Framework: zix | Test: all tests

Test Conn RPS CPU Mem Δ RPS Δ Mem
baseline 512 4,018,752 6491.1% 128MiB -4.7% -1.5%
baseline 4096 4,398,710 6426.3% 186MiB -2.1% ~0%
pipelined 512 53,079,958 6387.0% 124MiB -1.0% -7.5%
pipelined 4096 57,794,272 6420.1% 186MiB +3.2% ~0%
limited-conn 512 2,640,887 5649.7% 122MiB -3.6% -18.7%
limited-conn 4096 2,698,000 5831.0% 229MiB -1.9% -3.4%
json 4096 2,405,756 6061.2% 242MiB +2.4% -16.6%
json-comp 512 1,024,427 6249.5% 118MiB NEW NEW
json-comp 4096 1,139,676 6627.7% 208MiB NEW NEW
json-comp 16384 1,110,217 6821.1% 519MiB NEW NEW
json-tls 4096 1,922,974 5024.6% 273MiB NEW NEW
upload 32 8,944 1048.6% 121MiB +9.3% -2.4%
upload 256 6,469 889.0% 128MiB -2.9% -1.5%
api-4 256 67,725 215.0% 41MiB NEW NEW
api-16 1024 243,615 958.6% 118MiB NEW NEW
static 1024 2,022,673 5577.6% 141MiB -0.1% +0.7%
static 4096 2,018,326 5590.9% 205MiB -0.9% +5.1%
static 6800 1,976,393 5443.8% 265MiB -0.5% +10.0%
async-db 1024 406,353 3230.5% 325MiB NEW NEW
crud 4096 834,511 3304.5% 394MiB NEW NEW
Full log
[info] postgres ready (seeded)
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     1024 (16/thread)
  Pipeline:  1
  Req/conn:  25
  Templates: 5
  Expected:  200
  Duration:  10s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   1.94ms    800us   4.30ms   18.00ms   33.90ms

  4063526 requests in 10.00s, 4063536 responses
  Throughput: 406.25K req/s
  Bandwidth:  1.53GB/s
  Status codes: 2xx=4063536, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 4063528 / 4063536 responses (100.0%)
  Reconnects: 162078
  Per-template: 810271,812590,814524,814917,811226
  Per-template-ok: 810271,812590,814524,814917,811226
[info] CPU 3230.5% | Mem 325MiB

[run 2/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     1024 (16/thread)
  Pipeline:  1
  Req/conn:  25
  Templates: 5
  Expected:  200
  Duration:  10s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   2.15ms    693us   5.05ms   20.90ms   41.30ms

  3748261 requests in 10.00s, 3748259 responses
  Throughput: 374.75K req/s
  Bandwidth:  1.41GB/s
  Status codes: 2xx=3748259, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 3748249 / 3748259 responses (100.0%)
  Reconnects: 149944
  Per-template: 747430,749726,751570,751374,748149
  Per-template-ok: 747430,749726,751570,751374,748149
[info] CPU 3132.2% | Mem 320MiB

[run 3/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     1024 (16/thread)
  Pipeline:  1
  Req/conn:  25
  Templates: 5
  Expected:  200
  Duration:  10s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   2.19ms    747us   4.81ms   21.40ms   61.60ms

  3679544 requests in 10.00s, 3679547 responses
  Throughput: 367.88K req/s
  Bandwidth:  1.38GB/s
  Status codes: 2xx=3679547, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 3679531 / 3679547 responses (100.0%)
  Reconnects: 147195
  Per-template: 733752,735930,737990,737506,734353
  Per-template-ok: 733752,735930,737990,737506,734353
[info] CPU 3071.7% | Mem 319MiB

=== Best: 406353 req/s (CPU: 3230.5%, Mem: 325MiB) ===
[info] input BW: 27.13MB/s (avg template: 70 bytes)
[info] saved results/async-db/1024/zix.json
httparena-bench-zix
httparena-bench-zix

==============================================
=== zix / crud / 4096c (tool=gcannon) ===
==============================================
[info] resetting postgres for a clean per-profile baseline
[info] starting postgres sidecar
httparena-postgres
[info] postgres ready (seeded)
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  200
  Templates: 20
  Expected:  200
  Duration:  15s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   5.26ms   1.38ms   15.30ms   24.40ms   37.50ms

  11042873 requests in 15.00s, 11041354 responses
  Throughput: 735.98K req/s
  Bandwidth:  217.34MB/s
  Status codes: 2xx=11041354, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 11041354 / 11041354 responses (100.0%)
  Reconnects: 53121
  Per-template: 543069,514329,523485,528447,532012,525744,516797,512379,510562,511706,520290,532607,547345,564831,585871,609056,624332,629208,617297,591987
  Per-template-ok: 543069,514329,523485,528447,532012,525744,516797,512379,510562,511706,520290,532607,547345,564831,585871,609056,624332,629208,617297,591987
[info] CPU 2998.9% | Mem 401MiB

[run 2/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  200
  Templates: 20
  Expected:  200
  Duration:  15s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   4.78ms   1.58ms   13.60ms   23.70ms   32.30ms

  12075556 requests in 15.00s, 12075556 responses
  Throughput: 804.91K req/s
  Bandwidth:  236.28MB/s
  Status codes: 2xx=12075556, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 12075533 / 12075556 responses (100.0%)
  Reconnects: 58472
  Per-template: 573838,554711,569445,584376,593630,596784,593861,589237,585334,581678,583675,591002,598316,612708,631493,654798,663290,658595,642918,615844
  Per-template-ok: 573838,554711,569445,584376,593630,596784,593861,589237,585334,581678,583675,591002,598316,612708,631493,654798,663290,658595,642918,615844
[info] CPU 3153.8% | Mem 395MiB

[run 3/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  200
  Templates: 20
  Expected:  200
  Duration:  15s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   4.64ms   1.53ms   13.40ms   22.70ms   29.60ms

  12517672 requests in 15.00s, 12517672 responses
  Throughput: 834.39K req/s
  Bandwidth:  244.17MB/s
  Status codes: 2xx=12517672, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 12517653 / 12517672 responses (100.0%)
  Reconnects: 60650
  Per-template: 593914,575639,592522,604614,615290,623060,625370,624866,617981,613836,611261,610304,616720,631426,649083,669522,678055,671237,660210,632743
  Per-template-ok: 593914,575639,592522,604614,615290,623060,625370,624866,617981,613836,611261,610304,616720,631426,649083,669522,678055,671237,660210,632743
[info] CPU 3304.5% | Mem 394MiB

=== Best: 834511 req/s (CPU: 3304.5%, Mem: 394MiB) ===
[info] input BW: 71.63MB/s (avg template: 90 bytes)
[info] saved results/crud/4096/zix.json
httparena-bench-zix
httparena-bench-zix
[info] skip: zix does not subscribe to fortunes
[info] skip: zix does not subscribe to baseline-h2
[info] skip: zix does not subscribe to static-h2
[info] skip: zix does not subscribe to baseline-h2c
[info] skip: zix does not subscribe to json-h2c
[info] skip: zix does not subscribe to baseline-h3
[info] skip: zix does not subscribe to static-h3
[info] skip: zix does not subscribe to gateway-64
[info] skip: zix does not subscribe to gateway-h3
[info] skip: zix does not subscribe to production-stack
[info] skip: zix does not subscribe to unary-grpc
[info] skip: zix does not subscribe to unary-grpc-tls
[info] skip: zix does not subscribe to stream-grpc
[info] skip: zix does not subscribe to stream-grpc-tls
[info] skip: zix does not subscribe to echo-ws
[info] skip: zix does not subscribe to echo-ws-pipeline
[info] skip: zix does not subscribe to echo-ws-limited
[info] rebuilding site/data/*.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/frameworks.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/results/zix.json - 20 new, 22 total
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/current.json
[info] done
httparena-postgres
httparena-redis
[info] restoring loopback MTU to 65536

@prothegee

Copy link
Copy Markdown
Contributor Author

Ready to review before merge, @MDA2AV

@MDA2AV

MDA2AV commented Jul 26, 2026

Copy link
Copy Markdown
Owner

Ready to review before merge, @MDA2AV

Beem kinda busy, I'll do a full review tommorow, need some time to do it properly

@prothegee

Copy link
Copy Markdown
Contributor Author

Beem kinda busy, I'll do a full review tommorow, need some time to do it properly

Sure. Hope you doin well.

Regards.

@MDA2AV

MDA2AV commented Jul 31, 2026

Copy link
Copy Markdown
Owner

Ok, I reviewed again. Some things improved but some issues remain.

On the upload test, I must say your AI agent really went all in on this test.. technically following the rules but doing something no server would ever do. You count the bytes received but discard them and never read into zix's memory.. it is expected that a server reads the request data to its memory. As this is an engine and test is not scored, we can allow this but keep in mind this would never work on a production server.

On json tests, you need to serialize per request, not caching the serialized data at startup and then serve it. This one is important as json-tls is a scored test.

There are a lot other things zix is doing that are clearly benchmark oriented and would be a very big problem in a production use, however this is engine section so I won't pick on that but if you are planning on using it as an engine for a real server, there are quite a lot of issues.

On CRUD, the ttl seems to be addressed.

Regardless, it is an interesting project to push benchmark numbers! :)

@prothegee

Copy link
Copy Markdown
Contributor Author

Yes, zix.Http1 intent really rely on user implementation and promote for user control.
But since you brought that up, now I can add more tests to cover.

I knew it's engine category, but engine correctness is considerable aspect (despite some zix engine/s features).
So if there's a rule, it follow, but the engine intent should be adjusted again.

Converting to draft.
I'll mention you again after the fix, @MDA2AV

Thank you.

@prothegee
prothegee marked this pull request as draft July 31, 2026 15:51
@prothegee
prothegee marked this pull request as ready for review August 14, 2026 16:48
… propagation

- Migrate JSON parsing and serialization across `json`, `crud`, and `dataset`
  modules to use `jzon`, eliminating manual string building and `std.json`
  overhead.
- Remove response memoization and startup pre-serialization. The `json`
  handler now serializes per request, and `crudcache` strictly operates as a
  row-level cache-aside (holding decoded DB rows, not rendered HTTP responses)
  to accurately reflect benchmark profile constraints.
- Replace the custom `static` handler with the engine's native `public_dir`
  configuration.
- Enforce strict error propagation by converting handlers and shared responders
  (`response.zig`) to return `!void`, replacing silent error swallowing with
  `try`.
- Centralize byte-buffer formatting utilities (integers, strings, JSON
  escaping) into `shared/util.zig`.
- Refactor `dbpg` to use a shared `CrudWrite` payload for create/update jobs
  and improve lane arming logic for `.URING` vs `.EPOLL`/`.ASYNC` models.
- Add comprehensive module-level documentation explaining design choices,
  benchmark constraints, and engine interactions.
- Update `Dockerfile` to target Zix `0.5.x` and change Zig build summary to
  `failures`.
- Add `static-tls` to the `meta.json` test matrix.
@prothegee

prothegee commented Aug 14, 2026

Copy link
Copy Markdown
Contributor Author

Bump zix branch to 0.5.x

and follow-up #1121 (comment)

@prothegee

Copy link
Copy Markdown
Contributor Author

/benchmark -f zix

@github-actions

Copy link
Copy Markdown
Contributor

👋 Benchmark request received. A collaborator will review and approve the run.

@github-actions

Copy link
Copy Markdown
Contributor

Benchmark Results

Framework: zix | Test: all tests

Test Conn RPS CPU Mem Δ RPS Δ Mem
baseline 512 4,196,354 6415.5% 132MiB -0.5% +1.5%
baseline 4096 4,414,698 6415.8% 193MiB -1.7% +3.8%
pipelined 512 55,015,587 6307.8% 130MiB +2.6% -3.0%
pipelined 4096 57,749,619 6414.3% 192MiB +3.2% +3.2%
limited-conn 512 2,675,734 5499.9% 130MiB -2.4% -13.3%
limited-conn 4096 2,692,516 5804.1% 239MiB -2.1% +0.8%
json 4096 2,322,497 6536.4% 289MiB -1.1% -0.3%
json-comp 512 954,925 6171.1% 123MiB NEW NEW
json-comp 4096 1,053,292 6786.8% 211MiB NEW NEW
json-comp 16384 1,024,595 6808.2% 525MiB NEW NEW
json-tls 4096 1,893,961 5416.8% 279MiB NEW NEW
upload 32 9,003 1010.7% 129MiB +10.0% +4.0%
upload 256 6,457 904.0% 134MiB -3.1% +3.1%
api-4 256 67,993 234.6% 46MiB NEW NEW
api-16 1024 252,181 993.6% 125MiB NEW NEW
static 1024 1,859,747 6378.0% 157MiB -8.2% +12.1%
static 4096 1,914,036 6297.8% 231MiB -6.0% +18.5%
static 6800 1,873,690 6398.7% 293MiB -5.7% +21.6%
static-tls 1024 1,218,854 5135.0% 184MiB NEW NEW
static-tls 4096 1,023,293 4353.3% 306MiB NEW NEW
static-tls 6800 810,232 3700.9% 410MiB NEW NEW
async-db 1024 408,861 3219.0% 337MiB NEW NEW
crud 4096 831,891 3224.0% 388MiB NEW NEW
Full log
[info] postgres ready (seeded)
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     1024 (16/thread)
  Pipeline:  1
  Req/conn:  25
  Templates: 5
  Expected:  200
  Duration:  10s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   1.86ms    798us   4.01ms   16.80ms   27.40ms

  4088609 requests in 10.00s, 4088613 responses
  Throughput: 408.77K req/s
  Bandwidth:  1.54GB/s
  Status codes: 2xx=4088613, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 4088613 / 4088613 responses (100.0%)
  Reconnects: 163064
  Per-template: 814880,817784,820312,819942,815695
  Per-template-ok: 814880,817784,820312,819942,815695
[info] CPU 3219.0% | Mem 337MiB

[run 2/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     1024 (16/thread)
  Pipeline:  1
  Req/conn:  25
  Templates: 5
  Expected:  200
  Duration:  10s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   2.09ms    696us   5.45ms   18.90ms   28.10ms

  3781644 requests in 10.00s, 3781643 responses
  Throughput: 378.09K req/s
  Bandwidth:  1.42GB/s
  Status codes: 2xx=3781643, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 3781631 / 3781643 responses (100.0%)
  Reconnects: 151327
  Per-template: 753638,756254,758251,758425,755063
  Per-template-ok: 753637,756254,758251,758425,755063
[info] CPU 3126.3% | Mem 329MiB

[run 3/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     1024 (16/thread)
  Pipeline:  1
  Req/conn:  25
  Templates: 5
  Expected:  200
  Duration:  10s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   2.08ms    712us   5.23ms   19.10ms   30.70ms

  3780340 requests in 10.00s, 3780342 responses
  Throughput: 377.96K req/s
  Bandwidth:  1.42GB/s
  Status codes: 2xx=3780342, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 3780332 / 3780342 responses (100.0%)
  Reconnects: 151224
  Per-template: 753707,756013,758140,757787,754685
  Per-template-ok: 753707,756013,758140,757787,754685
[info] CPU 3131.8% | Mem 331MiB

=== Best: 408861 req/s (CPU: 3219.0%, Mem: 337MiB) ===
[info] input BW: 27.29MB/s (avg template: 70 bytes)
[info] saved results/async-db/1024/zix.json
httparena-bench-zix
httparena-bench-zix

==============================================
=== zix / crud / 4096c (tool=gcannon) ===
==============================================
[info] resetting postgres for a clean per-profile baseline
[info] starting postgres sidecar
httparena-postgres
[info] postgres ready (seeded)
[info] waiting for server...
[info] server ready

[run 1/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  200
  Templates: 20
  Expected:  200
  Duration:  15s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   5.22ms   1.58ms   15.00ms   23.50ms   35.50ms

  11071505 requests in 15.00s, 11071314 responses
  Throughput: 737.97K req/s
  Bandwidth:  217.11MB/s
  Status codes: 2xx=11071314, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 11071314 / 11071314 responses (100.0%)
  Reconnects: 53297
  Per-template: 545903,521500,535430,542726,544663,541217,531581,517658,509825,507229,515781,530056,543952,558436,578058,601125,617271,626377,612358,590168
  Per-template-ok: 545903,521500,535430,542726,544663,541217,531581,517658,509825,507229,515781,530056,543952,558436,578058,601125,617271,626377,612358,590168
[info] CPU 2937.1% | Mem 396MiB

[run 2/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  200
  Templates: 20
  Expected:  200
  Duration:  15s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   4.80ms   2.08ms   13.60ms   23.20ms   30.30ms

  12021175 requests in 15.00s, 12021175 responses
  Throughput: 801.28K req/s
  Bandwidth:  235.09MB/s
  Status codes: 2xx=12021175, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 12021160 / 12021175 responses (100.0%)
  Reconnects: 58139
  Per-template: 575787,560113,572978,581823,587522,587055,585285,581780,577108,573451,578193,586754,595778,609826,630465,650319,660836,660592,647425,618070
  Per-template-ok: 575787,560113,572978,581823,587522,587055,585285,581780,577108,573451,578193,586754,595778,609826,630465,650319,660836,660592,647425,618070
[info] CPU 3102.9% | Mem 388MiB

[run 3/3]
gcannon v0.5.3
  Target:    localhost:8080/
  Threads:   64
  Conns:     4096 (64/thread)
  Pipeline:  1
  Req/conn:  200
  Templates: 20
  Expected:  200
  Duration:  15s


  Thread Stats   Avg      p50      p90      p99    p99.9
    Latency   4.64ms   1.99ms   13.10ms   21.60ms   27.90ms

  12478370 requests in 15.00s, 12478368 responses
  Throughput: 831.76K req/s
  Bandwidth:  243.30MB/s
  Status codes: 2xx=12478368, 3xx=0, 4xx=0, 5xx=0
  Latency samples: 12478325 / 12478368 responses (100.0%)
  Reconnects: 60481
  Per-template: 596991,578115,592871,605877,609496,613495,615496,613763,611070,608152,604491,610511,619348,633273,650256,670292,676088,673304,658927,636509
  Per-template-ok: 596991,578115,592871,605877,609496,613495,615496,613763,611070,608152,604491,610511,619348,633273,650256,670292,676088,673304,658927,636509
[info] CPU 3224.0% | Mem 388MiB

=== Best: 831891 req/s (CPU: 3224.0%, Mem: 388MiB) ===
[info] input BW: 71.40MB/s (avg template: 90 bytes)
[info] saved results/crud/4096/zix.json
httparena-bench-zix
httparena-bench-zix
[info] skip: zix does not subscribe to fortunes
[info] skip: zix does not subscribe to baseline-h2
[info] skip: zix does not subscribe to static-h2
[info] skip: zix does not subscribe to baseline-h2c
[info] skip: zix does not subscribe to json-h2c
[info] skip: zix does not subscribe to baseline-h3
[info] skip: zix does not subscribe to static-h3
[info] skip: zix does not subscribe to gateway-64
[info] skip: zix does not subscribe to gateway-h3
[info] skip: zix does not subscribe to production-stack
[info] skip: zix does not subscribe to unary-grpc
[info] skip: zix does not subscribe to unary-grpc-tls
[info] skip: zix does not subscribe to stream-grpc
[info] skip: zix does not subscribe to stream-grpc-tls
[info] skip: zix does not subscribe to echo-ws
[info] skip: zix does not subscribe to echo-ws-pipeline
[info] skip: zix does not subscribe to echo-ws-limited
[info] rebuilding site/data/*.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/frameworks.json
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/results/zix.json - 23 new, 25 total
[updated] /home/diogo/actions-runner/_work/HttpArena/HttpArena/site/data/current.json
[info] done
httparena-postgres
httparena-redis
[info] restoring loopback MTU to 65536

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants